package com.zmn.oms.third.taobao;

import com.alibaba.fastjson.JSON;
import com.taobao.api.*;
import com.taobao.api.request.AlibabaSscSupplyplatformServicestoreOfflineRequest;
import com.taobao.api.request.AlibabaSscSupplyplatformServicestoreSaveRequest;
import com.taobao.api.response.AlibabaSscSupplyplatformServicestoreOfflineResponse;
import com.taobao.api.response.AlibabaSscSupplyplatformServicestoreSaveResponse;
import com.zmn.common.utils.string.StringUtil;
import com.zmn.oms.third.taobao.dto.api.TmallApiInvokResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.List;

/**
 * 类描述：淘宝API调用器 2.0版
 *  将业务逻辑和淘宝API调用进行了封装
 *
 * @author lhl
 * @date 2020/06/25 17:22
 */
@Slf4j
public final class TmallApiV2Invoker {

    /**
     * 服务容量相关接口
     */
    @Slf4j
    public static final class Capacity {

        /**
         * 网点-保存/更新
         *  接口说明：该接口是用来维护网点的信息。一个服务商可以维护多个网点，但是每一个网点的编码都是唯一的。
         *      其中接口中的字段是分业务场景的，不同的业务要求字段必填是不一样的，需要按照实际操作来。保存和修改是统一接口
         */
        public static TmallApiInvokResult<AlibabaSscSupplyplatformServicestoreSaveResponse.ServiceStoreCreateDto> saveServiceStore(
                AlibabaSscSupplyplatformServicestoreSaveRequest.ServiceStoreSaveForTopReqDTO requestParams) {
            log.info("【{}-API-V2-网点容量】<添加网点> ServiceStoreParams:[{}]", TaobaoTmcConstants.NAME_TMALL,
                    JSON.toJSONString(requestParams));
            TmallApiInvokResult result = new TmallApiInvokResult();
            result.setSuccess(false);

            // 校验参数完整性
            if (StringUtil.isBlank(requestParams.getServiceStoreCode())
                    || StringUtil.isBlank(requestParams.getServiceStoreName())
                    || StringUtil.isBlank(requestParams.getAddress())) {
                result.setMsg("参数不全：网点Code、名称、详细地址不能为空！");
                return result;
            }
            if (requestParams.getAddressId() == null
                    || (StringUtil.isBlank(requestParams.getLongitude())
                        || StringUtil.isBlank(requestParams.getLatitude())) ) {
                result.setMsg("参数不全：网点地址编码和经纬度不能同时为空！");
                return result;
            }

            // 执行请求
            AlibabaSscSupplyplatformServicestoreSaveRequest request = new AlibabaSscSupplyplatformServicestoreSaveRequest();
            request.setServiceStoreSaveReq(requestParams);
            AlibabaSscSupplyplatformServicestoreSaveResponse response = doApiInvok(null, request, null);

            // 解析请求结果
            if (response == null) {
                result.setMsg("请求连接失败。");
                return result;
            }
            result.setTaobaoResponse(response);

            AlibabaSscSupplyplatformServicestoreSaveResponse.Result responseResult = response.getResult();
            if (responseResult != null) {
                result.setSuccess(responseResult.getSuccess());
                result.setMsg(responseResult.getErrorMsg());
                result.setData(responseResult.getValue());
            }

            log.info("【{}-API-V2-网点容量】<添加网点结束> Result:[{}]", TaobaoTmcConstants.NAME_TMALL,
                    JSON.toJSONString(result));
            return result;
        }

        /**
         * 网点-下线
         *  接口说明：该接口是用来下线网点。下线的网点不会继续派单，但是可以继续履约，请谨慎操作。
         *      下线操作支持批量，参数为网点ID或Code的集合，每次批量操作网点的个数最多不超过20个。
         */
        public static TmallApiInvokResult offlineServiceStore(List<String> serviceStoreIdList) {
            log.info("【{}-API-V2-网点容量】<下线网点> ServiceStoreIds:[{}]", TaobaoTmcConstants.NAME_TMALL,
                    JSON.toJSONString(serviceStoreIdList));
            TmallApiInvokResult result = new TmallApiInvokResult();
            result.setSuccess(false);

            // 校验参数完整性
            if (serviceStoreIdList == null || serviceStoreIdList.size() < 1 || serviceStoreIdList.size() > 20) {
                result.setMsg("参数错误：操作网点数量必须在1-20个之间！");
                return result;
            }

            AlibabaSscSupplyplatformServicestoreOfflineRequest request
                    = new AlibabaSscSupplyplatformServicestoreOfflineRequest();
            request.setServiceStoreIdList(String.join(",", serviceStoreIdList));
            AlibabaSscSupplyplatformServicestoreOfflineResponse response = doApiInvok(null, request, null);

            // 解析请求结果
            if (response == null) {
                result.setMsg("请求连接失败。");
                return result;
            }
            result.setTaobaoResponse(response);

            AlibabaSscSupplyplatformServicestoreOfflineResponse.Result responseResult = response.getResult();
            if (responseResult != null) {
                result.setSuccess(responseResult.getSuccess());
                result.setMsg(responseResult.getErrorMsg());
            }

            log.info("【{}-API-V2-网点容量】<下线网点结束> Result:[{}]", TaobaoTmcConstants.NAME_TMALL,
                    JSON.toJSONString(result));
            return result;
        }

        /**
         * 服务能力-保存/更新
         *  接口作用：回传服务能力，可以让我们知道，哪些服务在哪些地区，有网点能够提供服务，从而才可以进行服务售卖。
         *      部分偏远区域无法支持部分服务，则不要回传对应的能力，这样不会在这些地区透出这些服务;
         *  说明：该接口用于维护网点的服务能力，调用该接口时所有字段请全量上传。一个网点只能维护一条能力与容量数据，
         *      如果原先没有数据会创建一条数据，如果有会则更新。如果需要维护多条数据，请拆分多个网点。
         */
        public static TmallApiInvokResult saveServiceAbility() {
            // AlibabaSscSupplyplatformServiceabilitySaveRequest
            // TODO -lhl 天猫网点-新增
            return null;
        }

        /**
         * 服务能力-删除
         */
        public static TmallApiInvokResult delServiceAbility() {
            // AlibabaSscSupplyplatformServiceabilityDeleteRequest
            // TODO -lhl 天猫网点-新增
            return null;
        }

        /**
         * 服务容量-保存/更新
         *  接口作用：回传网点容量，可以让我们知道，一个网点可以提供的服务上限，这样可以起到防超卖的作用。
         *      如果不会传容量数据，则无法支持消费者做主动预约（预约组件中的各个日期都会置灰，无法预约）
         *  说明：该接口用于维护网点的服务容量，调用该接口时所有字段请全量上传。一个网点只能维护一条容量数据，
         *      如果原先没有数据会创建一条数据，如果有会则更新。如果需要维护多条不同的容量数据，请拆分多个网点。
         */
        public static TmallApiInvokResult saveServiceCapacity() {
            // AlibabaSscSupplyplatformServicecapacitySaveRequest
            // TODO -lhl 天猫网点-新增
            return null;
        }

        /**
         * 服务容量-删除
         */
        public static TmallApiInvokResult delServiceCapacity() {
            // AlibabaSscSupplyplatformServicecapacityDeleteRequest
            // TODO -lhl 天猫网点-新增
            return null;
        }
    }


    private static <T extends TaobaoResponse> T doApiInvok(TaobaoClient client, TaobaoRequest<T> request, String token) {
        T response = null;
        try {
            if (StringUtils.isBlank(token)) {
                token = TaobaoTokenManager.getToken();
            }

            if (client == null) {
                client = new DefaultTaobaoClient(TaobaoTmcConstants.API_URL, TaobaoTmcConstants.APPKEY,
                        TaobaoTmcConstants.SECRET);
            }

            response = client.execute(request, token);
        } catch (ApiException e) {
            log.error(e.getMessage(), e);
        }
        return response;
    }
}
